﻿#pragma once

#include "ais/ais_base.h"
#include "ais/ais_context.h"

namespace CAGD
{

/**
 * 着色器.
 */
class Renderer
{
  public:
    /**
     * @brief 基本构造.
     * @param parent
     * @see
     */
    Renderer(MainOpenGLWidget *parent);

    /**
     * @brief 返回计数.
     * @return
     * @see
     */
    static int Count();

    /**
     * @brief 刷新着色器.
     * @param obj
     * @see
     */
    virtual void UpdateArray(AIS_Base *obj) = 0;

    /**
     * @brief 刷新 uniform 变量.
     * @param obj
     * @see
     */
    virtual void UpdateUniform(AIS_Base *obj) = 0;

    /**
     * @brief 渲染接口.
     * @param obj
     * @see
     */
    virtual void Draw(AIS_Base *obj) const = 0;

  protected:
    int m_arrayId;
    MainOpenGLWidget *m_parent;
    AIS_Context &m_context;
};

/**
 * 定义宏替换为智能指针.
 * 这里 Handle(Renderer)(*)() 是返回 Handle(Renderer) 的函数
 */
using RendererFactory = GenericFactory<Renderer, AIS_Type, Handle(Renderer) (*)(MainOpenGLWidget *)>;

/**
 * 构造渲染器.
 */
#define CAGD_CREATE_RENDERER(renderer)                                                                                 \
    static Handle(CAGD::Renderer) CreateRenderer(MainOpenGLWidget *parent)                                             \
    {                                                                                                                  \
        return Handle(CAGD::Renderer)(new renderer(parent));                                                           \
    }

} // namespace CAGD
